// create_hnsw_index.js - 直接创建HNSW索引文件
require('dotenv').config();
const { HNSWLib } = require("@langchain/community/vectorstores/hnswlib");
const { Embeddings } = require("@langchain/core/embeddings");
const { RecursiveCharacterTextSplitter } = require("@langchain/textsplitters");
const path = require('path');
const fs = require('fs');

// 自定义嵌入类，使用固定向量
class FixedEmbeddings extends Embeddings {
    constructor(fields) {
        super(fields || {});
    }

    async embedDocuments(texts) {
        const embeddings = [];
        for (const text of texts) {
            const embedding = await this.embedQuery(text);
            embeddings.push(embedding);
        }
        return embeddings;
    }

    async embedQuery(text) {
        // 返回固定向量
        return Array.from({ length: 1536 }, () => 0.1);
    }
}

// 修改向量存储路径为正确的路径
const VECTOR_STORE_PATH = path.join(__dirname, '../vector_store');
const embeddings = new FixedEmbeddings();
const textSplitter = new RecursiveCharacterTextSplitter({
    chunkSize: 500,
    chunkOverlap: 50,
});

async function createHNSWIndex() {
    try {
        console.log("开始创建HNSW索引...");
        
        // 确保目录存在
        if (!fs.existsSync(VECTOR_STORE_PATH)) {
            fs.mkdirSync(VECTOR_STORE_PATH, { recursive: true });
            console.log("创建向量存储目录");
        }
        
        // 创建测试文档
        const testDocs = await textSplitter.createDocuments([
            "React Hooks是React 16.8版本引入的新特性，它允许你在不编写class的情况下使用state以及其他的React特性。",
            "Vue Composition API是Vue 3.0中引入的新特性，它是对Vue 2.x中Options API的一种补充。",
            "JavaScript异步编程是JavaScript中非常重要的一部分，在JavaScript中，异步编程主要通过回调函数、Promise、async/await等方式来实现。"
        ], [
            { source: "react" },
            { source: "vue" },
            { source: "javascript" }
        ]);
        
        // 创建向量存储
        console.log("创建向量存储...");
        const vectorStore = await HNSWLib.fromDocuments(testDocs, embeddings);
        
        // 保存向量存储
        console.log("保存向量存储...");
        await vectorStore.save(VECTOR_STORE_PATH);
        console.log("向量存储保存成功");
        
        // 验证向量存储
        console.log("验证向量存储...");
        const loadedVectorStore = await HNSWLib.load(VECTOR_STORE_PATH, embeddings);
        const results = await loadedVectorStore.similaritySearch("React Hooks", 2);
        
        console.log("搜索结果:");
        results.forEach((result, index) => {
            console.log(`结果 ${index + 1}: ${result.pageContent.substring(0, 100)}...`);
        });
        
        // 检查文件大小
        console.log("\n检查生成的文件:");
        const files = fs.readdirSync(VECTOR_STORE_PATH);
        for (const file of files) {
            const filePath = path.join(VECTOR_STORE_PATH, file);
            const stats = fs.statSync(filePath);
            console.log(`${file}: ${stats.size} 字节`);
        }
        
        console.log("HNSW索引创建完成！");
        
    } catch (error) {
        console.error("创建HNSW索引失败:", error);
    }
}

// 运行创建
createHNSWIndex();